import threading
import time

s1 = threading.Semaphore(5)

#控制此时只有5个线程去执行print("ok") 剩下的线程等这信号量释放，如果不使用信号量，输出的时候20个ok差不多同时打印，如果使用了信号量，此时只是5个5个的打印
def foo():
    s1.acquire()
    time.sleep(2)
    print("ok")
    s1.release()

for i in range(20):
    t1 = threading.Thread(target=foo, args=())
    t1.start()  # 此时可以控制同时进入的线程数
